package xhw.test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @Author xhw
 * @Date 2023/11/26
 * @Version 1.0
 */

//创建十个多线程通过不断的new出新对象来进行制造垃圾然后通过减少分配的空间快速达到最大值，
// 之后通过等待进行垃圾回收解决outofmemory的报错
public class OutOfMemorytwo implements Runnable {
    //定义一个日志记录器
    private static final Logger logger = LoggerFactory.getLogger(OutOfMemorytwo.class);

    @Override
    public void run() {
        while (true) {
            try {
                while (true) {
                    // 模拟产生大量垃圾对象
                    generateGarbage();
                }
            } catch (OutOfMemoryError e) {
                // 当发生 OutOfMemoryError 时，打印错误信息
                logger.error("内存溢出异常：" + e.getMessage());


                // 等待一段时间，让垃圾回收完成
                try {
                    Thread.sleep(5000); // 5秒
                } catch (InterruptedException ex) {
                    if (logger.isErrorEnabled()) {
                        logger.error("线程被中断,{}", ex.getMessage(), ex);
                    }
                }
            }

        }
    }

    private void generateGarbage() {
        // 模拟产生垃圾对象
        Object[] garbage = new Object[100000];
        for (int i = 0; i < garbage.length; i++) {
            garbage[i] = new byte[10240]; // 创建10KB的对象
        }

        logger.debug("线程{}已经创建了{}个对象", Thread.currentThread().getName(), garbage.length);
    }

    public static void main(String[] args) {

        //创建十个多线程来产生垃圾
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(new OutOfMemorytwo());
            //设置为非守护线程
            thread.setDaemon(false);
            thread.start();
            logger.warn("第{}个线程已经启动", i);
        }
    }

}
